package com.server.rule;


import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import org.jdom.Document;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;


import com.server.store.rule.DmAsXml;
import com.server.store.rule.XmlStoreManager;
/**
 * Factory pour l'enregistrement et le chargement des systèmes des décision {@link DecisionMaker}
 * @author queyroi
 *
 */
public class DecisionMakerFactory {

	private static DecisionMakerFactory instance = new DecisionMakerFactory();
	/**
	 * Manager {@link XmlStoreManager} pour l'ergistrement des systèmes des décision {@link DecisionMaker} sous format xml dans le DataStore
	 */
	private static XmlStoreManager xmlStoreManager = new XmlStoreManager();
	
	private DecisionMakerFactory(){}
	/**
	 * Chemin sur le serveur des fichier xml
	 */
	private static final String path = "dmfiles/";
	
	/**
	 * @return the instance
	 */
	public final synchronized static  DecisionMakerFactory get() {
		return instance;
	}
	
	public DecisionMaker load(String nomDM) throws JDOMException, IOException{		
		if(getDmInStore(nomDM)==null){
			return loadFromXML(nomDM);
		}else{
			return loadFromStore(nomDM);
		}		
	}
	/**
	 * Méthode pour le chargement des fichier xml
	 * @param nomDM nom du systeme à charger
	 * @return Le système de décision 
	 * @throws JDOMException
	 * @throws IOException
	 */
	public DecisionMaker loadFromXML(String nomDM) throws JDOMException, IOException{
		DecisionMaker dm = new DecisionMaker();
		nomDM = path+nomDM+".xml";		
		SAXBuilder sxb = new SAXBuilder();
		Document document = sxb.build(new File(nomDM));			
		dm.generateFromXML(document.getRootElement());			
		return dm;
		
	}
	/**
	 *  Méthode pour le chargement des fichier xml depuis le Datastore
	 * @param nomDM nom du systeme à charger
	 * @return
	 * @throws JDOMException
	 * @throws IOException
	 */
	public DecisionMaker loadFromStore(String nomDM) throws JDOMException, IOException{
		DecisionMaker dm = new DecisionMaker();
		
		DmAsXml dmAsXml = getDmInStore(nomDM);
		if(dmAsXml!=null){				
			SAXBuilder sxb = new SAXBuilder();			
			Document document = sxb.build(new ByteArrayInputStream(dmAsXml.getContents().getBytes()));				
			dm.generateFromXML(document.getRootElement());			
			return dm;
		}
		return null;
		
	}
	/**
	 * Méthode pour l'enregistrement des système de décision dans le Datastore
	 * @param nomDM nom du systeme à sauver
	 * @param contents le contenu xml
	 * @throws NullPointerException
	 * @throws JDOMException
	 * @throws IOException
	 */
	public void saveAsXML(String nomDM,String contents) throws NullPointerException, JDOMException, IOException{
		DmAsXml dm = new DmAsXml(nomDM,contents);			
		for(DmAsXml dmStore : DecisionMakerFactory.get().getStore().getList()){
			if(dmStore.getName().equals(dm.getName())){				
				dmStore.setContents(dm.getContents()); 
				xmlStoreManager.save(dmStore);	
				return;
			}
		}
		xmlStoreManager.save(dm);	
	}
	
	public XmlStoreManager getStore(){
		return xmlStoreManager;
	}
	
	/**
	 * Methode pour lister les système de décision disponibles dans le DataStore
	 * @param nomDM
	 * @return
	 */
	public DmAsXml getDmInStore(String nomDM){
		for(DmAsXml dmAsXml : xmlStoreManager.getList()){
			if(dmAsXml.getName().equals(nomDM)) return dmAsXml;
		}
		return null;
	}
	
	
	
	
}
